//
//  ILLocalDeviceClient.h
//  IMILabKit
//
//  Created by OrrHsiao on 2022/10/11.
//

#import <Foundation/Foundation.h>
#import <ILLDFramework/ILLDFramework.h>
#import "ILLocalAPIs.h"
#import "ILBaseLocalAckModel.h"
#import "ILLocalDeviceDataUtil.h"

#if (IMI_LAB_SDK)
#import <IMILabKit/ILLocalDeviceClient.h>
#elif IMI_LAB_SDK_ALL
#import <IMILabSDK_All/IMILabSDK_All.h>
#else
#import <ILLocalDeviceClient.h>
#endif

typedef NS_ENUM(NSInteger, RespState) {
    //client 未建立连接异常，此错误码和业务层进行约定，并做出合适的提示语
    //    已经处于通话的情况下，另一个客户端发起通话请求的返回
    RESP_ERROR_TALK = -12,
     NOT_CONNECT = -1,
     // success
     RESP_SUCCESS= 0,
};

@protocol ILLocalDeviceClientDelegate <NSObject>

@optional

/// 收到控制指令回调
/// - Parameters:
///   - msg: 消息内容
///   - msg_len: 消息长度
- (void)receiveMsg:(const NSString * _Nonnull)msg msg_len:(int)msg_len;

/// 收到音频数据回调
/// - Parameter frame_info: Direct_AudioFrame
- (void)receiveAudio:(nonnull const char *)frame_info data:(nullable NSData *)data;

/// 收到视频数据回调
/// - Parameter frame_info: Direct_VideoFrame结构体
- (void)receiveVideo:(nonnull const char *)frame_info data:(nullable NSData *)data;


/// 客户端事件回调
/// - Parameter evt: 事件
/// CLI_CAM_EVT_CLOSED       = 0,
/// CLI_CAM_EVT_CONNECTING   = 1,
/// CLI_CAM_EVT_LOGINING     = 2,
/// CLI_CAM_EVT_CONNECTED    = 3,
/// CLI_CAM_EVT_DISCONNECTED = 4,
/// CLI_CAM_EVT_LOGIN_FAILED = 11,
- (void)receiveEvent:(int)evt;

@end

///-------------------------- msg callback---------------

 
/// 收到控制指令回调
///   - Parameters:
///   - msg: 消息内容
///   - msg_len: 消息长度
///   - error_code: 错误码 0=成功
typedef  void(^RespBlock)( NSDictionary * _Nullable data,RespState error_code);

//@protocol ILRespDelegate <NSObject>
//
//@required
///// 收到控制指令回调
/////   - Parameters:
/////   - msg: 消息内容
/////   - msg_len: 消息长度
/////   - error_code: 错误码 0=成功
//- (void)onResponse:(const NSDictionary * _Nullable )data error_code:( RespState ) error_code;
//
//
//@end



NS_ASSUME_NONNULL_BEGIN

@interface ILLocalDeviceClient : NSObject

/// 客户端是否已连接至设备
@property (nonatomic, assign, readonly) BOOL isConnect;

- (instancetype)init NS_UNAVAILABLE;
- (instancetype)new NS_UNAVAILABLE;
- (id)copy NS_UNAVAILABLE;
- (id)mutableCopy NS_UNAVAILABLE;

/// 获取实例
+ (instancetype)sharedInstance;

/// SDK初始化
- (void)initConfig;

/// SDK初始化
/// - Parameter verifyUrl: 网络联通状态校验时请求的网址,默认值为http://www.apple.com
- (void)initConfigWithVerifyUrl:(nullable NSString *)verifyUrl;

/// 添加代理
/// @param delegate 代理类对象
- (void)addDelegate:(id<ILLocalDeviceClientDelegate>)delegate;

/// 移除代理
/// @param delegate 代理类对象
- (void)removeDelegate:(id<ILLocalDeviceClientDelegate>)delegate;

/// 创建客户端(创建前必须先调用初始化)
- (void)native_create;

/// 连接服务,通过回调通知连接状态
/// - Parameters:
///   - ip: 服务ip
///   - token: 登录密钥
///   - deviceId: 设备id. 当断线重连后，服务端会根据device id匹配登录客户端
///   @return 0：成功，其他错误编码
- (int)connect:(nonnull NSString *)ip token:(nonnull NSString*)token deviceId:(nonnull NSString*)deviceId;

/// 发送消息数据
/// @param msg 要发送消息信息
- (void)send:(nonnull NSString*)msg;

/// 处理消息方便异步接收使用，delegate 只返回当前发送消息的响应，弥补了{ @link - (void)setDelegate } 的劣势（需要判断当前回复的消息是否是自己想要的回复）
/// @param msg 需要发送的消息内容
/// @param callback 返回结果
- (void)send:(nonnull NSString*)msg respBlock:(nullable RespBlock) respBlock;

/// 发送媒体数据
/// @param frameType 发送的帧类型，可以自行约定。 0 video 1 audio
/// @param frameInfo 要发送的音视频帧信息
/// @param dataStr 要发送的音视帧数据
- (void)sendMedia:(int)frameType frameInfo:(nonnull NSData *)frameInfo frameData:(nonnull NSData *)frameData;

/// 断开客户端连接
- (int)disConnect;

/// 断开客户端连接并释放所有资源
- (void)releaseCli;


#pragma mark - 下方相删除这些功能算在业务里面

///// 开始绑定
//- (void)startBind;
//
///// 停止绑定
//- (void)stopBind;
//
///// 开始播放
//- (void)startPlay;
//
///// 停止播放
//- (void)stopPlay;


@end

NS_ASSUME_NONNULL_END
